use once_cell::sync::Lazy;
use std::sync::Arc;
use std::time::Duration;
use reqwest::{Client, Method, header::HeaderMap};
use serde_json::Value;
use anyhow::{Result, anyhow, Context}; // 关键：导入 Context trait

// 全局客户端（pub 暴露，允许其他模块访问）
static GLOBAL_CLIENT: Lazy<Arc<Client>> = Lazy::new(|| {
    let client = Client::builder()
        .timeout(Duration::from_secs(10))
        .connect_timeout(Duration::from_secs(5))
        .build()
        .expect("初始化 HTTP 客户端失败");
    Arc::new(client)
});

/// 获取全局复用的客户端（pub 函数，供其他模块调用）
pub fn get_client() -> Arc<Client> {
    Arc::clone(&GLOBAL_CLIENT)
}

/// 通用 HTTP 请求方法
/// - way: 请求方式（"get" 或 "post"）
/// - url: 请求 URL
/// - headers: 自定义请求头（键值对集合）
/// - body: POST 请求体（GET 时可传 None）
pub async fn request_json(
    way: &str,
    url: &str,
    headers: HeaderMap,
    body: Option<&Value>,
) -> Result<Value> {
    // 获取全局复用的客户端（假设已实现全局客户端）
    let client = get_client();

    // 根据请求方式创建对应的请求构建器
    let request_builder = match way.to_lowercase().as_str() {
        "get" => client.request(Method::GET, url),
        "post" => {
            let body = body.ok_or_else(|| anyhow!("POST 请求需要提供 body"))?;
            client.request(Method::POST, url).json(body)
        }
        _ => return Err(anyhow!("不支持的请求方式: {}", way)),
    };

    // 设置请求头并发送请求
    let response = request_builder
        .headers(headers)  // 应用自定义请求头
        .send()
        .await
        .with_context(|| format!("{} 请求发送失败: {}", way, url))?;

    // 检查响应状态码
    if !response.status().is_success() {
        let status = response.status();
        let error_body = response.text().await.unwrap_or_default();
        return Err(anyhow!(
            "{} 请求失败 (状态码: {}): {}",
            way, status, error_body
        ));
    }

    // 解析响应为 JSON Value
    let json_data = response
        .json::<Value>()
        .await
        .with_context(|| "响应体不是有效的 JSON 格式")?;

    Ok(json_data)
}